import {
  getNewCartGoods,
  reqMergeLocalCart,
  reqFindCartList,
  reqInsertCart,
  reqDeleteCart,
  reqUpdateCartSku,
  reqCheckAllCart
} from '@/api/cart'

export default {
  namespaced: true,
  state: () => {
    return {
      list: []
    }
  },
  mutations: {
    setList(state, list) {
      state.list = list
    },
    insertCart(state, goods) {
      const idx = state.list.findIndex((item) => item.skuId === goods.skuId)
      if (idx >= 0) {
        // 找了了
        // 如果 list 中有 goods.skuId，只需要在原来的基础上 + goods.count
        state.list[idx].count += goods.count
      } else {
        // 如果 list 中没有 goods.skuId，直接把 goods 怼到 list 中
        state.list.unshift(goods)
      }
    },
    deleteCart(state, goods) {
      // 根据 goods.skuId 和 list 中每一项的 skuId 进行比较，找索引
      const idx = state.list.findIndex((item) => item.skuId === goods.skuId)
      // 根据索引去删除
      state.list.splice(idx, 1)
    },
    updateCart(state, goods) {
      // 根据 skuId 更新购物车的数据
      const sku = state.list.find((item) => item.skuId === goods.skuId)
      sku.isEffective = goods.isEffective
      sku.nowPrice = goods.nowPrice
      sku.oldPrice = goods.oldPrice
      sku.stock = goods.stock
      sku.discount = goods.discount
    },
    singleCheck(state, { goods, isSelect }) {
      // 根据 goods.skuId 找 state.list 里面的 sku，找出来之后修改 sku.selected 为 isSelect
      const sku = state.list.find((item) => item.skuId === goods.skuId)
      sku.selected = isSelect
    },
    checkEffectAll(state, isSelect) {
      state.list.forEach((item) => (item.selected = isSelect))
    },
    changeCount(state, { goods, count }) {
      // 根据 skuId 找到那一项，修改那一项的 count 为传递过来的 count
      const sku = state.list.find((item) => item.skuId === goods.skuId)
      sku.count = count
    }
  },
  actions: {
    // goods => 商品 => sku
    // 添加
    async asyncInsertCart(context, goods) {
      if (context.rootGetters.token) {
        // 已登录
        const { skuId, count } = goods
        // 加入购物车的结构
        await reqInsertCart({ skuId, count })
        await context.dispatch('asyncUpdateCart')
      } else {
        context.commit('insertCart', goods)
      }
    },
    // 删除
    async asyncDeleteCart(context, goods) {
      if (context.rootState.user.profile.token) {
        await reqDeleteCart([goods.skuId])
        await context.dispatch('asyncUpdateCart')
      } else {
        context.commit('deleteCart', goods)
      }
    },
    // !目标，刷新的时候，重新更新购物车数据
    asyncUpdateCart(context) {
      return new Promise((resolve) => {
        if (context.rootState.user.profile.token) {
          // 已登录
          // 获取线上购物车列表，拿到数据设置到 Vuex
          reqFindCartList().then((r) => {
            context.commit('setList', r.result)
            resolve()
          })
        } else {
          // 生成一组根据 skuId 更新购物侧的 Promise
          const arrPromise = context.state.list.map((item) =>
            getNewCartGoods(item.skuId)
          )
          Promise.all(arrPromise).then((r) => {
            // r => [{result: {}}, {result: {}}]
            r.forEach((item, index) => {
              context.commit('updateCart', {
                skuId: context.state.list[index].skuId,
                ...item.result
              })
            })
            // !mark
            resolve()
          })
        }
      })
    },
    async asyncSingleCheck(context, { goods, isSelect }) {
      if (context.rootState.user.profile.token) {
        // 已登录
        await reqUpdateCartSku({ skuId: goods.skuId, selected: isSelect })
        await context.dispatch('asyncUpdateCart')
      } else {
        context.commit('singleCheck', { goods, isSelect })
      }
    },
    async asyncCheckEffectAll(context, isSelect) {
      if (context.rootState.user.profile.token) {
        // 已登录
        const skuIds = context.getters.effectiveList.map((item) => item.skuId)
        await reqCheckAllCart({ selected: isSelect, ids: skuIds })
        await context.dispatch('asyncUpdateCart')
      } else {
        context.commit('checkEffectAll', isSelect)
      }
    },
    async asyncChangeCount(context, { goods, count }) {
      if (context.rootState.user.profile.token) {
        // 已登录
        await reqUpdateCartSku({
          skuId: goods.skuId,
          count
        })
        await context.dispatch('asyncUpdateCart')
      } else {
        context.commit('changeCount', { goods, count })
      }
    },
    async asyncMergeLocalCart(context) {
      const arr = context.state.list.map(({ skuId, selected, count }) => ({
        skuId,
        selected,
        count
      }))
      // 调用合并购物车的接口
      await reqMergeLocalCart(arr)
      // 更新购物车
      await context.dispatch('asyncUpdateCart')
    }
  },
  getters: {
    // 有效的商品列表
    effectiveList(state) {
      return state.list.filter((item) => item.stock > 0 && item.isEffective)
    },
    // 有效的商品数量
    effectiveTotal(state, getters) {
      // 从【有效的商品】里面，对一个商品对象的 count 进行累计
      return getters.effectiveList.reduce((acc, cur) => acc + cur.count, 0)
    },
    // 有效的商品总价
    effectiveTotalPrice(state, getters) {
      // 从【有效的商品】里面，对一个商品对象的 count * nowPrice 进行累计
      return getters.effectiveList.reduce(
        (acc, cur) => acc + cur.count * cur.nowPrice,
        0
      )
    },
    // 无效的商品列表
    ineffectiveList(state) {
      return state.list.filter((item) => !(item.stock > 0 && item.isEffective))
    },
    // 已选的有效列表
    selectedList(state, getters) {
      // 从有效的里面要 selected 为 true
      return getters.effectiveList.filter((item) => item.selected)
    },
    // 已选择的有效列表数量
    selectedAllCounts(state, getters) {
      return getters.selectedList.reduce((acc, cur) => acc + cur.count, 0)
    },
    // 已选择的有效列表总价
    selectedAllPrice(state, getters) {
      return getters.selectedList.reduce(
        (acc, cur) => acc + cur.count * cur.nowPrice,
        0
      )
    },
    // 全选按钮的选中状态
    isAllEffectSelected(state, getters) {
      // 有效的长度和选中的长度
      return (
        getters.effectiveList.length === getters.selectedList.length &&
        getters.effectiveList.length > 0
      )
    }
  }
}

// ctrl + k / ctrl + 0 => 收起全部
// ctrl + k / ctrl + J => 展开全部
// ctrl + k / ctrl + } => 展开当前
// ctrl + k / ctrl + { => 收起当前
